/*
 * Base.h
 *
 *  Created on: 29/08/2010
 *      Author: julian
 */
#ifndef BASE_H_
#define BASE_H_

#include <GL/glut.h>
#include "cabina.h"
#define PI 3.141592653589793

class Base : protected DisplayList {
private:
	Cabina* laCabina;
	float pos[3];
	float dir[3];
	float angulo;



public:
	Base(Cabina* nuevaCabina){
		this->laCabina=nuevaCabina;
		dir[0] = 1;
		dir[1] = dir[2] = 0;
		pos[0] = pos[1] = pos[2] = 0;
		inicializar();
	}

virtual void ejecucion() const{
                //Dibujo unas ruedas
                glPushMatrix();
                glColor3ub(022,022,022);
                glTranslatef(0.0,1.5,0.375);
                glScalef(5.5,1.0,0.75);
                glutSolidCube(1.0);
                glPopMatrix();

                //Dibujo otras ruedas
                glPushMatrix();
                glColor3ub(022,022,022);
                glTranslatef(0.0,-1.5,0.375);
                glScalef(5.5,1.0,0.75);
                glutSolidCube(1.0);
                glPopMatrix();

                //Dibujo la parte superior de la base
                glPushMatrix();
                glColor3ub(255,198,000);
                glTranslatef(0.0,0.0,1);
                glScalef(6,4.5,0.5);
                glutSolidCube(1.0);
                glPopMatrix();


        }

virtual void dibujar() const{
	glTranslatef(pos[0],pos[1],pos[2]);
	glRotatef(angulo,0,0,1);
	DisplayList::dibujar();
        //Cambio de sistema de referencia para dibujar cabina
        glPushMatrix();
        	glTranslatef(0.0,0.0,1.425);
		glScalef(3,3.75,3.5);
        	laCabina->dibujar();
        glPopMatrix();
}

/*
 Modifica la posicion de la grua avanzando en la direccion actual
*/
void avanzar(float cantidad){
	pos[0] += cantidad*dir[0]; 
	pos[1] += cantidad*dir[1]; 
	pos[2] += cantidad*dir[2]; 
}

/*
 Modifica la posicion de la grua retrocediendo en la direccion opuesta a la actual
*/
void retroceder(float cantidad){
	pos[0] -= cantidad*dir[0]; 
	pos[1] -= cantidad*dir[1]; 
	pos[2] -= cantidad*dir[2]; 
}

/*
 Gira la grua en el angulo especificado en grados en el sentido de las agujas del reloj
*/
void girarDerecha(float ang){
	this->angulo -= ang;
	float coseno = cos(angulo*PI/180);
	float seno = sin(angulo*PI/180);
	dir[0] = coseno;
	dir[1] = seno;
	dir[2] = 0;
}

/*
 Gira la grua en el angulo especificado en grados en el sentido contrario a las agujas del reloj
*/
void girarIzquierda(float ang){
	this->angulo += ang;
	float coseno = cos(angulo*PI/180);
	float seno = sin(angulo*PI/180);
	dir[0] = coseno;
	dir[1] = seno;
	dir[2] = 0;
}

/*
 Retorna un vector con la posicion de la grua
*/
float* getPos(){
	return pos;	
}

	virtual ~Base(){}
};

#endif /* BASE_H_ */
